﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using CapaLogica.CL.UtilidadesGenerales;
using CapaLogica.CL.Usuario;
using System.Data.SqlClient;

namespace CapaLogica.CL.Entrada
{
    public class EntradaPersistente
    {
        private AcessoBD _acceso = new AcessoBD();

        internal int insertarEntrada(Cl_Entrada pEntrada, int pIdBlog)
        {
            int nuevoId = -1;
            Parametros[] parametros = new Parametros[3];
            String sql = @"insert into dbo.T_Entrada(titulo, comentario, id_blog)
                                values(param1, param2, param3) ";

            parametros[0] = new Parametros(pEntrada.Titulo, "param1");
            parametros[1] = new Parametros(pEntrada.Comentario, "param2");
            parametros[2] = new Parametros(pIdBlog, "param3");

            try
            {
               nuevoId = _acceso.executeSQLInsert(sql, parametros);

                //BITACORA
               Modulo.insertarBitacora(Session.Id, "Creación de una nueva entrada", nuevoId, 18, 1);
                //---------------

               return nuevoId;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        internal List<EsEntrada> listarEntradasBlog(int pidBlog)//parametros del grupo
        {
            List<EsEntrada> entradas = new List<EsEntrada>();
            DateTime fechaFin = DateTime.MinValue;

            EsEntrada entrada;
            string psp = @"sp_listar_entradas_blog";

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pidBlog, "idBlog");

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    if (!reader.IsDBNull(5))
                    {
                        fechaFin = reader.GetDateTime(5);
                    }

                    entrada = new EsEntrada(reader.GetInt32(0) + "", reader.GetString(1), reader.GetString(2),
                                           reader.GetDateTime(3).ToShortDateString(), reader.GetBoolean(4),
                                           fechaFin.ToShortDateString(), reader.GetInt32(6) + "", reader.GetString(7), 0+"");
                    entradas.Add(entrada);
                }
                reader.Close();

                return entradas;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public EsEntrada buscarEntradaPorId(int pIdEntrada)//parametros del grupo
        {
           
            string psp = @"dbo.sp_buscar_entrada_id";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdEntrada, "idEntrada");
            DateTime fechaFin = DateTime.MinValue;

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                if (reader.Read())
                {
                    if (!reader.IsDBNull(5))
                    {
                        fechaFin = reader.GetDateTime(5);
                    }

                    EsEntrada entrada = new EsEntrada(reader.GetInt32(0) + "", reader.GetString(1), reader.GetString(2),
                                           reader.GetDateTime(3).ToShortDateString(), reader.GetBoolean(4),
                                           fechaFin.ToShortDateString(), reader.GetInt32(6) + "", reader.GetString(7), 0 + "");

                    reader.Close();
                    return entrada;
                }
                else
                {
                    throw new Exception("No se encontro la entrada.");
                }

                

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }



        internal void modificarEntrada(Cl_Entrada pEntrada, int idEntrada)
        {

            try
            {
                byte modificar = 1;
                DateTime fechaHoy = DateTime.Now;
                

                Parametros[] parametros = new Parametros[5];

                string sql = @"update dbo.T_Entrada set titulo = param1, comentario = param2, modificado = param3, fecha_modificacion = param4 where id_entrada = param0";

                parametros[0] = new Parametros(idEntrada, "param0");
                parametros[1] = new Parametros(pEntrada.Titulo, "param1");
                parametros[2] = new Parametros(pEntrada.Comentario, "param2");
                parametros[3] = new Parametros(modificar, "param3");
                parametros[4] = new Parametros(fechaHoy, "param4");


                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(Session.Id, "Modificacion de una entrada", pEntrada.IdEntrada, 18, 3);

            }
            catch (Exception)
            {

                throw new Exception("Hubo un error al intentar modificar la carrera. La carrera no ha sido modificada.");
            }


        }


        internal List<EsEntrada> listarEntradasBlogPorFecha(int pidBlog, DateTime pFechaInicio, DateTime pFechaFin)//parametros del grupo
        {
            List<EsEntrada> entradas = new List<EsEntrada>();
            DateTime fechaFin = DateTime.MinValue;

            EsEntrada entrada;
            string psp = @"sp_buscar_entradas_por_fecha";

            Parametros[] parametros = new Parametros[3];
            parametros[0] = new Parametros(pidBlog, "idBlog");
            parametros[1] = new Parametros(pFechaInicio, "fechaInicio");
            parametros[2] = new Parametros(pFechaFin, "fechaFin");

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    if (!reader.IsDBNull(5))
                    {
                        fechaFin = reader.GetDateTime(5);
                    }

                    entrada = new EsEntrada(reader.GetInt32(0) + "", reader.GetString(1), reader.GetString(2),
                                           reader.GetDateTime(3).ToShortDateString(), reader.GetBoolean(4),
                                           fechaFin.ToShortDateString(), reader.GetInt32(6) + "", reader.GetString(7), 0 + "");
                    entradas.Add(entrada);
                }
                reader.Close();

                return entradas;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        internal void asignarCalificacionEntradaBlog(int pidEntrada, double pnota, int pUsuario)
        {
            int pidNota = 0;
            Parametros[] parametros = new Parametros[3];

            String sql = @"insert into dbo.T_Notas_Entrada (id_entrada, nota, id_usuario)
                             values(param1, param2, param3) ";

            parametros[0] = new Parametros(pidEntrada, "param1");
            parametros[1] = new Parametros(pnota, "param2");
            parametros[2] = new Parametros(pUsuario, "param3");
            try
            {
                pidNota = _acceso.executeSQLInsert(sql, parametros);
                Modulo.insertarBitacora(pUsuario, "Asignacion de una nota a la entrada de un Blog", pidNota, 10, 1);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public void eliminarComentarioEntrada(int pidEntrada, int pIdusuario)
        {
            try
            {
                String sql = @"delete dbo.T_Comentario_Entrada     
					            where id_Entrada = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pidEntrada, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de Comentario Entrada", pIdusuario, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        public void eliminarEntradaBlog(int pidEntrada, int pIdusuario)
        {
            try
            {
                String sql = @"delete dbo.T_Entrada     
					            where id_Entrada = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pidEntrada, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de Entrada", pIdusuario, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

      
        internal void asignarCalificacionEntradaBlog(int pidEntrada, int pUsuario)
        {
            int pidNota = 0;
            Parametros[] parametros = new Parametros[2];

            String sql = @"insert into dbo.T_Notas_Entrada (id_entrada, nota)
                             values(param1, param2) ";

            parametros[0] = new Parametros(pidEntrada, "param1");
            parametros[1] = new Parametros(pUsuario, "param2");
            try
            {
                pidNota = _acceso.executeSQLInsert(sql, parametros);
                Modulo.insertarBitacora(pUsuario, "Asignacion de una nota a la entrada de un Blog", pidNota, 10, 1);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }


    }
}
